#include <stdio.h>

//求数字n的二进制序列中1个数
//方法一
/*int num_of_1(int n)
{
    int i = 0;
    //最低位&1
    int count = 0;
    while(i<32)
    {
        if((n >> i) &1 == 1)
        {
            count++;
        }
        i++;
    }
    return count;
}*/

//方法二
//n=15
//n = n & (n-1)
//0000 1111 15
//0000 1110 14
//0000 1110 n
//0000 1101 n-1
//0000 1100 n
//每次 n&(n-1)都会把n的最右边的1去掉
int num_of_1(int n)
{
    int count = 0;
    while(n)
    {
        n = n & (n-1);
        count++;
    }
    return count;
}

//判断一个数是不是2的n次方
//2^0 0001
//2^1 0010
//2^2 0100
//2^n 中只有一个1
//n = n&(n-1)每次去掉一个1
//判断是否2的n次方只要n&n-1等于0即可
//是返回1，否返回0
int if_pow_2(int n)
{
    int flag = 0;
    if((n & (n-1)) == 0)
    {
        flag = 1;
    }
    return flag;
}

int main()
{
    int n = 0;
    printf("请输入n:>");
    scanf("%d", &n);
    int ret = num_of_1(n);
    printf("%d中有%d个1\n",n,ret);

    int flag = if_pow_2(n);
    if(flag)
        printf("%d是2的次方\n",n);
    else
        printf("不是");
    return 0;
}